/*
scoped_ptr也要有RAII和像指针一样的特点，它采用防拷贝的方式。
（防拷贝：将拷贝构造和赋值运算符是声明实现，并且声明为私有，
因为我们自己声明，就不会调用系统自动生成的，而且如果只声明，
就会有人在类外定义，所以必须声明为私有）
*/
#include <iostream>

using namespace std;
template<typename T>
class Scoped_Ptr
{
    protected:
        T* _ptr;
    public:
        Scoped_Ptr(T *ptr):_ptr(ptr) {}
        ~Scoped_Ptr()
        {
            if(_ptr)
            {
                delete _ptr;
            }
        }
        T* operator->()
        {
            return _ptr;
        }
        T& operator*()
        {
            return * _ptr;
        }

    private:
        Scoped_Ptr(const Scoped_Ptr<T> & sp);
        Scoped_Ptr<T> operator=(const Scoped_Ptr<T> & sp);

};

int main()
{
    Scoped_Ptr<int> sp(new int(10));
    cout<<*sp<<endl;
    //Scoped_Ptr<int> sp1(sp);  不能使用拷贝构造函数
}